// function
// 函数是一等公民


function add(x: number, y: number, z?: number): number {
  if (typeof z === 'number') {
    return x + y + z
  }
  return x + y
}

let ret = add(1, 2)

let ret1 = add(1, 2, 3)

// error
// 不能在不确定的参数后面添加确定参数
// function add1(x: number, y: number, z?: number, t:number): number {
//   if (typeof z === 'number') {
//     return x + y + z
//   }
//   return x + y
// }


// type (x: number, y: number, z?: number):number=>{}
const add2 = (x: number, y: number, z?: number): number => {
  if (typeof z === 'number') {
    return x + y + z
  }
  return x + y
}

let ret2: (x: number, y: number, z?: number) => number = add


// interface 模拟 ()=>
interface ISum {
  (x: number, y: number, z?: number): number
}

let ret3: ISum = add